package com.zjsru.plan2025.oneday;

import java.util.HashMap;
import java.util.Map;

/**
 * 2506. 统计相似字符串对的数目
 *
 * @Author: cookLee
 * @Date: 2025-02-22
 */
public class SimilarPairs {

    /**
     * 主
     * \
     * 输入：words = ["aba","aabb","abcd","bac","aabc"]
     * 输出：2
     * 解释：共有 2 对满足条件：
     * - i = 0 且 j = 1 ：words[0] 和 words[1] 只由字符 'a' 和 'b' 组成。
     * - i = 3 且 j = 4 ：words[3] 和 words[4] 只由字符 'a'、'b' 和 'c' 。
     * \
     * 输入：words = ["aabb","ab","ba"]
     * 输出：3
     * 解释：共有 3 对满足条件：
     * - i = 0 且 j = 1 ：words[0] 和 words[1] 只由字符 'a' 和 'b' 组成。
     * - i = 0 且 j = 2 ：words[0] 和 words[2] 只由字符 'a' 和 'b' 组成。
     * - i = 1 且 j = 2 ：words[1] 和 words[2] 只由字符 'a' 和 'b' 组成。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SimilarPairs similarPairs = new SimilarPairs();
        String[] words = new String[]{"aba", "aabb", "abcd", "bac", "aabc"};
        System.out.println(similarPairs.similarPairs(words));
    }


    public int similarPairs(String[] words) {
        int ans = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (String word : words) {
            //字符串s中出现过的字母视作一个集合，把这个集合压缩成一个二进制数mask
            int mask = 0;
            for (char ch : word.toCharArray()) {
                mask |= 1 << (ch - 'a');
            }
            Integer count = map.getOrDefault(mask, 0);
            ans += count;
            map.put(mask, count + 1);
        }
        return ans;
    }
}
